package org.example.component;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.DocumentParser;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.loader.UrlDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.parser.apache.pdfbox.ApachePdfBoxDocumentParser;
import dev.langchain4j.data.document.parser.apache.poi.ApachePoiDocumentParser;
import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.chroma.ChromaEmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

@Configuration
public class ComponentConfig 
{
	@Autowired
	MysqlChatMemoryStore mysqlChatMemoryStore;
	
	@Bean
	public ChatMemoryProvider chatMemoryProvider()
	{
		return new ChatMemoryProvider() {
			@Override
			public ChatMemory get(Object o) {	//这个o就是消息ID唯一标识
				return MessageWindowChatMemory.builder()
						.id(o)	//唯一标识
						.maxMessages(5)
						.chatMemoryStore(mysqlChatMemoryStore)	//配置提供ChatMemoryStore接口
						.build();
			}
		};
	}
	
	@Autowired
	EmbeddingModel embeddingModel;
	
	//构建向量数据库操作对象
//	@Bean
	public EmbeddingStore store()	//名字配置为store，如果配置名为embeddingStore会重名，有一个默认的
	{
//		List<Document> text = ClassPathDocumentLoader.loadDocuments("text",new ApachePdfBoxDocumentParser());
//		List<Document> text = ClassPathDocumentLoader.loadDocuments("text",new ApacheTikaDocumentParser());


		Document text = FileSystemDocumentLoader.loadDocument("C:\\Users\\Xiri\\Desktop\\Learn_LangChain4j\\LangChain-RAG\\src\\main\\resources\\text\\2025hbgk.pdf",new ApachePdfBoxDocumentParser());
		
		
//		FileSystemDocumentLoader.loadDocument()
		
//		new ApacheTikaDocumentParser
		//加载文档中的内容进入内存	
//		List<Document> text = ClassPathDocumentLoader.loadDocuments("text");
		//网络链接加载
		//湖北省2025年普通高校招生录取控制分数线 网址
//		Document text = UrlDocumentLoader.load("https://jyt.hubei.gov.cn/zfxxgk/zc_GK2020/qtzdgkwj_GK2020/202506/t20250626_5706550.shtml", new ApacheTikaDocumentParser());
//		DocumentParser
//		new PdfDocumentParser();
//		new ApachePdfBoxDocumentParser();
//		new TextDocumentParser();

		//构建文档分割器对象
		DocumentSplitter recursive = DocumentSplitters.recursive(
				500,//每个片段最大能容纳的字符
				100//两个片段之间重叠字符个数
		);
//		EmbeddingStore

		//构建向量数据库操作对象
//		InMemoryEmbeddingStore store = new InMemoryEmbeddingStore();
		//构建一个EmbeddingStoreIngestor对象 完成数据切割、向量化、存储
		EmbeddingStoreIngestor build = EmbeddingStoreIngestor.builder()
				.embeddingStore(chromaEmbeddingStore())
				.documentSplitter(recursive)//设置文档分割器
				.embeddingModel(embeddingModel)	//设置向量模型
				.build();
		build.ingest(text);	//

		return chromaEmbeddingStore();
//		return store;
	}
	
	//构建向量数据库检索对象
	@Bean
	public ContentRetriever contentRetriever()
	{
		return EmbeddingStoreContentRetriever.builder()
				.embeddingStore(chromaEmbeddingStore())
				.maxResults(3)	//最大数据
				.minScore(0.6)	//相似度
				.embeddingModel(embeddingModel)	//设置向量模型
				.build();
	}
	
	/*
	     api-key: ${API-KEY} #使用环境变量配置
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1  #基地址
      model-name: text-embedding-v1 #文本向量模型
      log-requests: true  #请求
      log-responses: true #响应
	 */
	
	//构建Chroma向量数据库
	@Bean
	public ChromaEmbeddingStore chromaEmbeddingStore()
	{
		return ChromaEmbeddingStore.builder()
				.baseUrl("http://localhost:8000") // Chroma 服务地址
				.collectionName("my-collection") // 向量集合名称
				.logRequests(true)			//请求日志
				.logResponses(true)			//响应日志
				.build();
	}
	
}
